from pydantic import BaseModel
import mysql.connector
from mysql.connector import Error
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
import requests
import json
from typing import List, Dict, Any

# from openai import OpenAI


from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(title="医疗报告摘要生成服务", version="1.0.0")

# 允许跨域请求的域名列表
origins = [
    "http://localhost:3100",  # 前端开发服务器
    "http://localhost:8080",  # 其他可能的前端地址
    # 添加生产环境域名
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],  # 允许所有 HTTP 方法（包括 OPTIONS）
    allow_headers=["*"],  # 允许所有请求头
)


class ElderCareAgent:
    """养老数据智能代理完整实现"""

    def __init__(self):
        # 1. 初始化api接口
        self.api_url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
        self.api_key = "sk-f6c68712c4f44b01a57c758e7fa18be5"
        self.headers = {"Content-Type": "application/json", "Authorization": f"Bearer {self.api_key}"}
        self.messages = [{"role": "user", "content": []}]

        # 3. 初始化数据库连接
        self.db_conn = mysql.connector.connect(
            host="localhost",
            port=3306,
            user="root",
            password="123456",
            database="cereshop",
            charset="utf8mb4",
        )

    def save_data(self, data: List[dict]) -> None:
        """将健康数据存入数据库"""
        # {'id_card': '110223********0576', 'agency_name': '通州果园西社区养老服务驿站', 'service_category': '照护者护理技能培训', 'project_type': '单项目', 'service_content': '照护
        # 者护理技能培训', 'appointment_time': '2024-05-03 16:41:18'},

        # cursor = self.db_conn.cursor()
        # sql = """
        #     INSERT INTO health_data (id_card, agency_name, service_category, project_type, service_content,appointment_time)
        #     VALUES (%s, %s, %s, %s, %s,%s)
        # """
        # values = []
        # for item in data:
        #     # 假设item包含这些字段
        #     id_card = item.get("id_card")
        #     agency_name = item.get("agency_name", "通州果园西社区养老服务驿站")
        #     service_category = item.get("temperature", "照护者护理技能培训")
        #     project_type = item.get("activity_level", "单项目")
        #     service_content = item.get("service_content", "照护者护理技能培训")
        #     appointment_time = item.get("appointment_time", "2024-05-03 16:41:18")
        #     values.append((id_card, agency_name, service_category, project_type, service_content,appointment_time))
        # cursor.executemany(sql, values)
        # self.db_conn.commit()
        # print(f"批量保存数据，共{len(values)}条")
        print("=== 保存数据 ===")

    def generate_report(self, prompt: str) -> Dict[str, Any]:
        """生成评估报告"""
        data = {
            "model": "qwen-max",
            "input": {"prompt": prompt},
            "parameters": {"temperature": 0.1, "top_p": 0.8, "max_length": 1000},
        }
        response = requests.post(self.api_url, headers=self.headers, data=json.dumps(data))
        response.raise_for_status()
        result = response.json()

        # print(result)

        if "output" in result and "text" in result["output"]:
            return result["output"]["text"].strip()


agent = ElderCareAgent()


class PullDataRequest(BaseModel):
    id: str

class PullDataOrderRequest(BaseModel):
    id: str
    atype: str
    hospital_name: str
    start_time: str
    end_time: str

@app.post("/pull-data")
async def pull_data(request: PullDataRequest) -> JSONResponse:
    try:
        # 模拟从外部系统拉取数据
        id = request.id
        url = "http://localhost:8000/api/agent/instruct/"
        instruction = (
            f"帮我查一下id_card为{id}的老人的服务数据，并脱敏后逐条返还给我，给我记录就可以，不需要总结"
        )
        payload = {"instruction": instruction}
        headers = {"Content-Type": "application/json"}
        response = requests.post(url, json=payload, headers=headers)

        result = response.json()
        print(result)
        data = result["answer"]
        # data = result["msg"]["data"]
        # print(data)

        prompt = f"""
            【任务】
            分析以下养老服务预约记录，生成综合性分析报告，需包含数据统计、趋势分析。

            【服务记录】
            {data}

            【分析维度】
            1. 基础统计：
            - 服务类别分布（如照护培训、健康讲座、生活照料等）
            - 预约时间规律（月份/时段分布）
            - 项目类型占比（单项目/套餐/长期服务）

            2. 趋势分析：
            - 近3个月服务类别变化趋势
            - 同一老人重复预约的服务类型（复购率）
            - 新出现的服务需求（如从护理转向康复、心理）

            【输出要求】
            1. 使用中文简洁回答(100字以内）。
            2. 关键数据需量化（如占比、次数、增长率）
            3. 结论部分需提炼2-4个用户标签（简短精炼，如需生活照料）。
            4. 每个分析维度字数控制在50字以内。
            5. 服务记录均为同一个老人，输出不要出现‘同一老人’，请用'您'指代。
            6. 输出结果请用json格式返回，包含'basicinfo'、'trend'、'label'，分别代表
            '基础统计'、'趋势分析'和'用户标签'，返回的json字段格式及解释如下
            {{
                "basicinfo": "基础统计维度分析",
                "trend": "趋势分析维度分析",
                "label": "提炼的2-4个用户标签，每个标签用|隔开"
            }}
            7. 你的返回只是一个json对象，不要添加其他任何多余的文本
        """
        agent.save_data(data)
        print("=== 评估报告 ===")
        report = agent.generate_report(prompt)
        print(report)
        return JSONResponse(content={"status": "success", "report": report, "data": data})

    except Exception as e:
        print(f"处理出错: {str(e)}")


@app.post("/pull-data-zhongyang")
async def pull_data(request: PullDataRequest) -> JSONResponse:
    try:
        # 模拟从外部系统拉取数据
        id = request.id
        url = "http://localhost:8000/api/agent/instruct/"
        instruction = (
            f"帮我查一下id为{id}的老人的所有类型的服务数据，对于每一个服务类型的结果，附带上该类型的名称，并脱敏后逐条返还给我，给我记录就可以，不需要总结"
        )
        payload = {"instruction": instruction}
        headers = {"Content-Type": "application/json"}
        response = requests.post(url, json=payload, headers=headers)

        result = response.json()
        print(result)
        data = result["answer"]
        # data = result["msg"]["data"]
        # print(data)

        prompt = f"""
            【任务】
            分析以下养老服务预约记录，包括了服务商和服务名称生成综合性分析报告，需包含数据统计、趋势分析。

            【服务记录】
            {data}

            【分析维度】
            1. 基础统计：
            - 服务类别分布（如照护培训、健康讲座、生活照料等）
            - 预约时间规律（月份/时段分布）
            - 项目类型占比（单项目/套餐/长期服务）

            2. 趋势分析：
            - 近3个月服务类别变化趋势
            - 同一老人重复预约的服务类型（复购率）
            - 新出现的服务需求（如从护理转向康复、心理）

            【输出要求】
            1. 使用中文简洁回答(100字以内）。
            2. 关键数据需量化（如占比、次数、增长率）
            3. 结论部分需提炼2-4个用户标签（简短精炼，如需生活照料）。
            4. 每个分析维度字数控制在50字以内。
            5. 服务记录均为同一个老人，输出不要出现‘同一老人’，请用'您'指代。
            6. 输出结果请用json格式返回，包含'basicinfo'、'trend'、'label'，分别代表
            '基础统计'、'趋势分析'和'用户标签'，返回的json字段格式及解释如下
            {{
                "basicinfo": "基础统计维度分析",
                "trend": "趋势分析维度分析",
                "label": "提炼的2-4个用户标签，每个标签用|隔开"
            }}
            7. 你的返回只是一个json对象，不要添加其他任何多余的文本
        """
        agent.save_data(data)
        print("=== 评估报告 ===")
        report = agent.generate_report(prompt)
        print(report)
        return JSONResponse(content={"status": "success", "report": report, "data": data})

    except Exception as e:
        print(f"处理出错: {str(e)}")


@app.post("/pull-data-zhongshan")
async def pull_data_zhongshan(request: PullDataRequest) -> JSONResponse:
    try:
        # 模拟从外部系统拉取数据
        id = request.id
        url = "http://localhost:8000/api/agent/instruct/"
        instruction = f"帮我查一下user_id为{id}的老人的最新7条的体征数据，逐条返还给我，给我记录就可以，给我sql查询后原始的记录，不需要总结，特别是时间，不要修改时间的精度，如果没有七条数据，则全部返回，如果超过七条数据，则返回最新的七条数据"
        payload = {"instruction": instruction}
        headers = {"Content-Type": "application/json"}
        response = requests.post(url, json=payload, headers=headers)

        result = response.json()
        print(result)
        data = result["answer"]
        # data = result["msg"]["data"]
        # print(data)

        prompt = f"""
            【任务】
            分析以下体征数据记录，提取每条记录中的体征信息，并按照指定格式返回。
            
            【体征数据】
            {data}

            【输出要求】
            1. 从每条体征数据记录中提取以下内容：
               - 体重
               - 心率
               - 呼吸
               - 收缩压
               - 舒张压
               - 体温
               - 血糖
               - 创建时间

            2. 每条记录返回JSON格式：  
            {{
                "weight": "具体数值",
                "heartRate": "具体数值",
                "breathe": "具体数值", 
                "systolicPressure": "具体数值",
                "diastolicPressure": "具体数值",
                "temperature": "具体数值",
                "bloodSugar": "具体数值"，
                "createTime": "具体时间"
            }}

            3. 将所有提取的JSON对象组成一个列表返回，格式如：[{...}, {...}, {...}]
            4. 如果某个字段在原数据中缺失，请填入空字符串""
            5. 你只需要给我返回这个json的列表，不要给我其他任何内容
            6. 你返回的json列表最多7条，如果超过7条，则返回最新的7条数据
        """
        agent.save_data(data)
        print("=== 体征报告 ===")
        report = agent.generate_report(prompt)
        print(report)
        return JSONResponse(content={"status": "success", "report": report})

    except Exception as e:
        print(f"处理出错: {str(e)}")

@app.post("/pull-data-order")
async def pull_data_order(request: PullDataOrderRequest) -> JSONResponse:
    try:
        # 模拟从外部系统拉取数据
        id = request.id
        print(request)
        atype = request.atype
        url = "http://localhost:8000/api/agent/instruct/"
        instruction = f"帮我查一下id为{id}的老人的{atype}记录，逐条返还给我，给我记录就可以，给我sql查询后原始的记录，不需要总结，特别是时间，不要修改时间的精度"
        payload = {"instruction": instruction}
        headers = {"Content-Type": "application/json"}
        response = requests.post(url, json=payload, headers=headers)

        result = response.json()
        print(result)
        data = result["answer"]
        hospital_name = request.hospital_name
        start_time = request.start_time
        end_time = request.end_time
        # data = result["msg"]["data"]
        # print(data)

        prompt = f"""
            【任务】
            分析以下服务记录，提取每条记录中信息，并帮我判断是否有满足我的条件的记录。
          
            【服务记录】
            {data}  

            【条件】
            1. 医院名称为{hospital_name}
            2. 服务时间在{start_time}至{end_time}之间

            【输出要求】
            1. 返回为json格式，包含以下字段：
               - 是否有满足条件的记录
            2. 返回为{{"has_satisfied": true/false}}
            3. 你只需要给我返回这个json对象，不要给我其他任何内容
        """
        agent.save_data(data)
        print("=== 返回结果 ===")
        report = agent.generate_report(prompt)
        print(report)
        return JSONResponse(content={"status": "success", "report": report})

    except Exception as e:
        print(f"处理出错: {str(e)}")


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8010, log_level="info")
